Load Packages
First I need to load up the packages I’ll need
library(sf)
Linking to GEOS 3.4.2, GDAL 2.1.2, proj.4 4.9.1
library(ggplot2) #development version!
## devtools::install_github("tidyverse/ggplot2")
library(tidyverse)
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages ------------------------------------------------------
filter(): dplyr, stats
lag(): dplyr, stats
library(readr)
## Not sure about this bit
#library("tidyverse",lib.loc="/Library/Frameworks/R.framework/Versions/3.4/Resources/library")
Import Data
Now I import my data. I filter for the Arran postcodes, (since Arran all begins ‘KA27’).
## Finding the Arran coordinates
library(dplyr)
allcoordinates <- read.csv("alldata/ukpostcodes.csv")
arrancoordinates <- filter(allcoordinates,substr(postcode,1,4)=="KA27")
Plot Coordinates
Now I plot these coordinates.
## Plotting the Arran coordinates
ggplot(data = arrancoordinates) +
geom_point(mapping = aes(x = longitude, y = latitude)) +
ggtitle("Arran Postcodes") +
labs(title = "Arran Postcodes", x = "Longitude", y = "Latitude") +
theme(plot.title = element_text(hjust = 0.5))

Now I create some plots. #Arran Borders
pcs <- read_sf("alldata/Scotland_pcs_2011")
#Print Post codes lists
arransubsect <- filter(pcs,substr(label,1,4)=="KA27")
arransubsect %>%
ggplot() +
geom_sf() +
theme(axis.text.x=element_text(angle=45, hjust = 1))

Shape files
Then I can load the shape files.
#Import SIMD data from http://www.gov.scot/Topics/Statistics/SIMD
#The "new data zone boundaries with SIMD16 ranks (zipped shapefile)"
#'2011 Data Zone boundaries'
DZBoundaries2016 <- read_sf("./alldata/SG_SIMD_2016")
#https://data.gov.uk/dataset/scottish-index-of-multiple-deprivation-simd-2012
#https://data.gov.uk/dataset/scottish-index-of-multiple-deprivation-simd-2012/resource/d6fa8924-83da-4e80-a560-4ef0477f230b
DZBoundaries2012 <- read_sf("./alldata/SG_SIMD_2012")
DZBoundaries2009 <- read_sf("./alldata/SG_SIMD_2009")
DZBoundaries2006 <- read_sf("./alldata/SG_SIMD_2006")
DZBoundaries2004 <- read_sf("./alldata/SG_SIMD_2004")
Load SIMD data
Then (having already downloaded it), I can load the SIMD data.
#Look at data from 2016
SIMD2016 <-read.csv("./alldata/00505244.csv")
SIMD20162 <-read_sf("./alldata/SG_SIMD_2016")
#Look at data from 2012
SIMD2012 <- readxl::read_excel("./alldata/SIMD2012/00410770.xls")
SIMD20122 <- readxl::read_excel("./alldata/SIMD2012/00416552.xls")
#Look at data from 2009
SIMD2009 <- readxl::read_excel("./alldata/SIMD2009/0096578.xls")
SIMD20092 <- readxl::read_excel("./alldata/SIMD2009/0097806.xls")
#Look at data from 2006
# 2009 data - SIMD2006 <- readxl::read_excel("./alldata/SIMD2006/0096578.xls")
SIMD20062 <- readxl::read_excel("./alldata/SIMD2006/0097880.xls")
#Look at data from 2004
SIMD2004 <- readxl::read_excel("./alldata/SIMD2004/0027003.xls")
Select Arran SIMD data
I have to choose the right columns manually in order to select the Arran data.
#Selecting ArranDZ2016
Arrandz <- c(4672,4666,4669,4671,4667,4668,4670)
#Health domain rank
#2016
arran2016 <- SIMD20162[Arrandz,]
#Find postcode look-up, KA27 postcodes. Find unique DZ. Find row positions.
#Selecting ArranDZ2012
Arrandz2012 <- c(4409,4372,4353,4352,4351,4350,4349)
#2012
arran2012 <- DZBoundaries2012[Arrandz2012,]
#2009
arran2009 <- DZBoundaries2009[Arrandz2012,]
#2006
arran2006 <- DZBoundaries2006[Arrandz2012,]
#2004
arran2004 <- DZBoundaries2004[Arrandz2012,]
The reason I’ve downloaded all the datazones shapefiles individually (three steps up), is because they change between 2016 and 2012.
arran20162 <- arran2016 %>%
select(DataZone, geometry, Percentile) %>%
mutate(year="2016")
arran20122 <- arran2012 %>%
select(DataZone, geometry, Percentile) %>%
mutate(year="2012")
arran1612 <- rbind(arran20162,arran20122)
See the small difference.
arran1612 %>%
ggplot() +
geom_sf(aes(fill = DataZone)) +
facet_wrap('year') +
theme(legend.position="none") +
theme(axis.text.x=element_text(angle=45, hjust = 1))

Now I want to plot all the data, first I combine it all into one table. First I subselect the data I want from the appropriate columns.
arran20092 <- arran2009 %>%
select(DataZone, geometry, Percentile) %>%
mutate(year="2009")
arran20062 <- arran2006 %>%
select(DataZone, geometry, Percentile) %>%
mutate(year="2006")
arran20042 <- arran2004 %>%
select(DataZone, geometry, Percentile) %>%
mutate(year="2004")
arransimd <- rbind(arran20162,arran20122,arran20092,arran20062,arran20042)
Then I plot the data zones to look at all of them, just to double-check nothing else changed. (It looks like the only change was between 2012 and 2016).
arransimd %>%
ggplot() +
geom_sf(aes(fill = DataZone)) +
facet_wrap('year') +
theme(legend.position="none") +
theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank(), axis.text.y=element_blank(),
axis.ticks.y=element_blank())

Arran Percentile Plots
Now I plot the percentiles.
arransimd %>%
ggplot() +
geom_sf(aes(fill = Percentile)) +
facet_wrap('year') +
theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank(), axis.text.y=element_blank(),
axis.ticks.y=element_blank())

There we are. Not the SIMD health percentiles of Arran zones throughout SIMD history. And I’ve learned a little bit about graphics in R.
If I wanted to I could show the zones individually..
First I find the unique zones. (There are 14. 7 Zones 2016, 7 Zones pre-2016)
datazones <- unique(arransimd$DataZone)
I’ll have to find out a simpler way to do this but..
Pre-2016 Individual Zones
S01004409 <- filter(arransimd, DataZone=="S01004409")
S01004372 <- filter(arransimd, DataZone=="S01004372")
S01004353 <- filter(arransimd, DataZone=="S01004353")
S01004352 <- filter(arransimd, DataZone=="S01004352")
S01004351 <- filter(arransimd, DataZone=="S01004351")
S01004350 <- filter(arransimd, DataZone=="S01004350")
S01004349 <- filter(arransimd, DataZone=="S01004349")
function1 <- function(argument)
{
argument %>%
ggplot() +
geom_sf(aes(fill = Percentile)) +
facet_wrap('year') +
theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank())
}
function2(S01004409)

function2(S01004372)

function2(S01004353)

function2(S01004352)

function2(S01004351)

function2(S01004350)

function2(S01004349)

This is all well and good. But I found it difficult to remember which zone went where. So I’ve plotted a reference image to go beside the charts. #Pre-2016 Reference Images
function2 <- function(argument)
{
arransubsect %>%
ggplot() +
geom_sf() +
theme(axis.text.x=element_text(angle=45, hjust = 1)) +
geom_sf(data= argument, aes(fill = DataZone))
}
arransubsect <- filter(pcs,substr(label,1,4)=="KA27")
function3(S01004409)

function3(S01004372)

function3(S01004353)

function3(S01004352)

function3(S01004351)

function3(S01004350)

function3(S01004349)

But thinking about it, I could plot all the years together like this. #Pre-2016 Individual Zones shown on whole island
function3 <- function(argument)
{
argument %>%
ggplot() +
geom_sf(data = arransubsect) +
geom_sf(aes(fill = Percentile)) +
facet_wrap('year') +
theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank())
}
function3(S01004409)

function3(S01004372)

function3(S01004353)

function3(S01004352)

function3(S01004351)
function3(S01004350)
2016
Now I apply the same functions to the post-2016 Zones
S01011177 <- filter(arransimd, DataZone=="S01011177")
S01011171 <- filter(arransimd, DataZone=="S01011171")
S01011174 <- filter(arransimd, DataZone=="S01011174")
S01011176 <- filter(arransimd, DataZone=="S01011176")
S01011172 <- filter(arransimd, DataZone=="S01011172")
S01011173 <- filter(arransimd, DataZone=="S01011173")
S01011175 <- filter(arransimd, DataZone=="S01011175")
function1(S01011177)

function1(S01011171)

function1(S01011174)

function1(S01011176)

function1(S01011172)

function1(S01011173)

function1(S01011175)

function2(S01011177)
function2(S01011171)
function2(S01011174)
function2(S01011176)
function2(S01011172)
function2(S01011173)
function2(S01011175)
function3(S01011177)
function3(S01011171)
function3(S01011174)
function3(S01011176)
function3(S01011172)
function3(S01011173)
function3(S01011175)
Plot the percentiles as bar charts.
arransimd %>%
ggplot(aes(x=year, y=Percentile)) +
geom_bar(stat="identity") +
facet_wrap('DataZone') +
labs(title = "Arran SIMD Datazones", x = "Year", y = "Percentile") +
theme(plot.title = element_text(hjust = 0.5))
Splitting the bar charts up.
Ideally now I’d like to annotate the above data to highlight the 2016 plots, and show where the change in DZ occurs. (I.e draw a polygon around S01011171-S01011177). I don’t know how to do that yet, so what I’ll do now is seperate it into 2 plots.
Pre-2016
arransimd2 <- dplyr::filter(arransimd, year < 2016)
arransimd2 %>%
ggplot(aes(x=year, y=Percentile)) +
geom_bar(stat="identity") +
facet_wrap('DataZone') +
labs(title = "Arran SIMD Datazones", x = "Year", y = "Percentile") +
theme(plot.title = element_text(hjust = 0.5))
Post-2016
arransimd3 <- dplyr::filter(arransimd, year >= 2016)
arransimd3 %>%
ggplot(aes(x=year, y=Percentile)) +
geom_bar(stat="identity") +
facet_wrap('DataZone') +
labs(title = "Arran SIMD Datazones", x = "Year", y = "Percentile") +
theme(plot.title = element_text(hjust = 0.5))
LS0tCnRpdGxlOiAiQXJyYW4iCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KI0xvYWQgUGFja2FnZXMKRmlyc3QgSSBuZWVkIHRvIGxvYWQgdXAgdGhlIHBhY2thZ2VzIEknbGwgbmVlZApgYGB7cn0KbGlicmFyeShzZikKbGlicmFyeShnZ3Bsb3QyKSAjZGV2ZWxvcG1lbnQgdmVyc2lvbiEKIyMgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJ0aWR5dmVyc2UvZ2dwbG90MiIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWRyKQojIyBOb3Qgc3VyZSBhYm91dCB0aGlzIGJpdAojbGlicmFyeSgidGlkeXZlcnNlIixsaWIubG9jPSIvTGlicmFyeS9GcmFtZXdvcmtzL1IuZnJhbWV3b3JrL1ZlcnNpb25zLzMuNC9SZXNvdXJjZXMvbGlicmFyeSIpCmBgYAoKI0ltcG9ydCBEYXRhCk5vdyBJIGltcG9ydCBteSBkYXRhLiBJIGZpbHRlciBmb3IgdGhlIEFycmFuIHBvc3Rjb2RlcywgKHNpbmNlIEFycmFuIGFsbCBiZWdpbnMgJ0tBMjcnKS4KYGBge3J9CiMjIEZpbmRpbmcgdGhlIEFycmFuIGNvb3JkaW5hdGVzCmxpYnJhcnkoZHBseXIpCmFsbGNvb3JkaW5hdGVzIDwtIHJlYWQuY3N2KCJhbGxkYXRhL3VrcG9zdGNvZGVzLmNzdiIpCmFycmFuY29vcmRpbmF0ZXMgPC0gZmlsdGVyKGFsbGNvb3JkaW5hdGVzLHN1YnN0cihwb3N0Y29kZSwxLDQpPT0iS0EyNyIpCmBgYAoKI1Bsb3QgQ29vcmRpbmF0ZXMKTm93IEkgcGxvdCB0aGVzZSBjb29yZGluYXRlcy4KYGBge3J9CiMjIFBsb3R0aW5nIHRoZSBBcnJhbiBjb29yZGluYXRlcwpnZ3Bsb3QoZGF0YSA9IGFycmFuY29vcmRpbmF0ZXMpICsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IGxvbmdpdHVkZSwgeSA9IGxhdGl0dWRlKSkgKwogIGdndGl0bGUoIkFycmFuIFBvc3Rjb2RlcyIpICsKICBsYWJzKHRpdGxlID0gIkFycmFuIFBvc3Rjb2RlcyIsIHggPSAiTG9uZ2l0dWRlIiwgeSA9ICJMYXRpdHVkZSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgpOb3cgSSBjcmVhdGUgc29tZSBwbG90cy4KI0FycmFuIEJvcmRlcnMKYGBge3J9CnBjcyA8LSByZWFkX3NmKCJhbGxkYXRhL1Njb3RsYW5kX3Bjc18yMDExIikKCiNQcmludCBQb3N0IGNvZGVzIGxpc3RzCmFycmFuc3Vic2VjdCA8LSBmaWx0ZXIocGNzLHN1YnN0cihsYWJlbCwxLDQpPT0iS0EyNyIpCmFycmFuc3Vic2VjdCAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9zZigpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0ID0gMSkpCmBgYAoKI1NoYXBlIGZpbGVzClRoZW4gSSBjYW4gbG9hZCB0aGUgc2hhcGUgZmlsZXMuCmBgYHtyfQojSW1wb3J0IFNJTUQgZGF0YSBmcm9tIGh0dHA6Ly93d3cuZ292LnNjb3QvVG9waWNzL1N0YXRpc3RpY3MvU0lNRAojVGhlICJuZXcgZGF0YSB6b25lIGJvdW5kYXJpZXMgd2l0aCBTSU1EMTYgcmFua3MgKHppcHBlZCBzaGFwZWZpbGUpIgojJzIwMTEgRGF0YSBab25lIGJvdW5kYXJpZXMnCgpEWkJvdW5kYXJpZXMyMDE2IDwtIHJlYWRfc2YoIi4vYWxsZGF0YS9TR19TSU1EXzIwMTYiKQoKI2h0dHBzOi8vZGF0YS5nb3YudWsvZGF0YXNldC9zY290dGlzaC1pbmRleC1vZi1tdWx0aXBsZS1kZXByaXZhdGlvbi1zaW1kLTIwMTIKI2h0dHBzOi8vZGF0YS5nb3YudWsvZGF0YXNldC9zY290dGlzaC1pbmRleC1vZi1tdWx0aXBsZS1kZXByaXZhdGlvbi1zaW1kLTIwMTIvcmVzb3VyY2UvZDZmYTg5MjQtODNkYS00ZTgwLWE1NjAtNGVmMDQ3N2YyMzBiCkRaQm91bmRhcmllczIwMTIgPC0gcmVhZF9zZigiLi9hbGxkYXRhL1NHX1NJTURfMjAxMiIpCkRaQm91bmRhcmllczIwMDkgPC0gcmVhZF9zZigiLi9hbGxkYXRhL1NHX1NJTURfMjAwOSIpCkRaQm91bmRhcmllczIwMDYgPC0gcmVhZF9zZigiLi9hbGxkYXRhL1NHX1NJTURfMjAwNiIpCkRaQm91bmRhcmllczIwMDQgPC0gcmVhZF9zZigiLi9hbGxkYXRhL1NHX1NJTURfMjAwNCIpCmBgYAoKI0xvYWQgU0lNRCBkYXRhClRoZW4gKGhhdmluZyBhbHJlYWR5IGRvd25sb2FkZWQgaXQpLCBJIGNhbiBsb2FkIHRoZSBTSU1EIGRhdGEuCmBgYHtyfQojTG9vayBhdCBkYXRhIGZyb20gMjAxNgpTSU1EMjAxNiA8LXJlYWQuY3N2KCIuL2FsbGRhdGEvMDA1MDUyNDQuY3N2IikKU0lNRDIwMTYyIDwtcmVhZF9zZigiLi9hbGxkYXRhL1NHX1NJTURfMjAxNiIpCgojTG9vayBhdCBkYXRhIGZyb20gMjAxMgpTSU1EMjAxMiA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIi4vYWxsZGF0YS9TSU1EMjAxMi8wMDQxMDc3MC54bHMiKQpTSU1EMjAxMjIgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCIuL2FsbGRhdGEvU0lNRDIwMTIvMDA0MTY1NTIueGxzIikKCiNMb29rIGF0IGRhdGEgZnJvbSAyMDA5ClNJTUQyMDA5IDwtIHJlYWR4bDo6cmVhZF9leGNlbCgiLi9hbGxkYXRhL1NJTUQyMDA5LzAwOTY1NzgueGxzIikKU0lNRDIwMDkyIDwtIHJlYWR4bDo6cmVhZF9leGNlbCgiLi9hbGxkYXRhL1NJTUQyMDA5LzAwOTc4MDYueGxzIikKCiNMb29rIGF0IGRhdGEgZnJvbSAyMDA2CiMgMjAwOSBkYXRhIC0gU0lNRDIwMDYgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCIuL2FsbGRhdGEvU0lNRDIwMDYvMDA5NjU3OC54bHMiKQpTSU1EMjAwNjIgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCIuL2FsbGRhdGEvU0lNRDIwMDYvMDA5Nzg4MC54bHMiKQoKI0xvb2sgYXQgZGF0YSBmcm9tIDIwMDQKU0lNRDIwMDQgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCIuL2FsbGRhdGEvU0lNRDIwMDQvMDAyNzAwMy54bHMiKQpgYGAKCiNTZWxlY3QgQXJyYW4gU0lNRCBkYXRhCkkgaGF2ZSB0byBjaG9vc2UgdGhlIHJpZ2h0IGNvbHVtbnMgbWFudWFsbHkgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBBcnJhbiBkYXRhLgpgYGB7cn0KI1NlbGVjdGluZyBBcnJhbkRaMjAxNgpBcnJhbmR6IDwtIGMoNDY3Miw0NjY2LDQ2NjksNDY3MSw0NjY3LDQ2NjgsNDY3MCkKCiNIZWFsdGggZG9tYWluIHJhbmsKIzIwMTYKYXJyYW4yMDE2IDwtIFNJTUQyMDE2MltBcnJhbmR6LF0KCiNGaW5kIHBvc3Rjb2RlIGxvb2stdXAsIEtBMjcgcG9zdGNvZGVzLiBGaW5kIHVuaXF1ZSBEWi4gRmluZCByb3cgcG9zaXRpb25zLgoKI1NlbGVjdGluZyBBcnJhbkRaMjAxMgpBcnJhbmR6MjAxMiA8LSBjKDQ0MDksNDM3Miw0MzUzLDQzNTIsNDM1MSw0MzUwLDQzNDkpCgojMjAxMgphcnJhbjIwMTIgPC0gRFpCb3VuZGFyaWVzMjAxMltBcnJhbmR6MjAxMixdCiMyMDA5CmFycmFuMjAwOSA8LSBEWkJvdW5kYXJpZXMyMDA5W0FycmFuZHoyMDEyLF0KIzIwMDYKYXJyYW4yMDA2IDwtIERaQm91bmRhcmllczIwMDZbQXJyYW5kejIwMTIsXQojMjAwNAphcnJhbjIwMDQgPC0gRFpCb3VuZGFyaWVzMjAwNFtBcnJhbmR6MjAxMixdCmBgYAoKVGhlIHJlYXNvbiBJJ3ZlIGRvd25sb2FkZWQgYWxsIHRoZSBkYXRhem9uZXMgc2hhcGVmaWxlcyBpbmRpdmlkdWFsbHkgKHRocmVlIHN0ZXBzIHVwKSwgaXMgYmVjYXVzZSB0aGV5IGNoYW5nZSBiZXR3ZWVuIDIwMTYgYW5kIDIwMTIuCgpgYGB7cn0KYXJyYW4yMDE2MiA8LSBhcnJhbjIwMTYgJT4lCiAgc2VsZWN0KERhdGFab25lLCBnZW9tZXRyeSwgUGVyY2VudGlsZSkgICU+JQogIG11dGF0ZSh5ZWFyPSIyMDE2IikKCmFycmFuMjAxMjIgPC0gYXJyYW4yMDEyICU+JQogIHNlbGVjdChEYXRhWm9uZSwgZ2VvbWV0cnksIFBlcmNlbnRpbGUpICU+JQogIG11dGF0ZSh5ZWFyPSIyMDEyIikKCmFycmFuMTYxMiA8LSByYmluZChhcnJhbjIwMTYyLGFycmFuMjAxMjIpCmBgYAoKU2VlIHRoZSBzbWFsbCBkaWZmZXJlbmNlLgpgYGB7cn0KYXJyYW4xNjEyICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGFlcyhmaWxsID0gRGF0YVpvbmUpKSArCiAgZmFjZXRfd3JhcCgneWVhcicpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEpKQpgYGAKCk5vdyBJIHdhbnQgdG8gcGxvdCBhbGwgdGhlIGRhdGEsIGZpcnN0IEkgY29tYmluZSBpdCBhbGwgaW50byBvbmUgdGFibGUuCkZpcnN0IEkgc3Vic2VsZWN0IHRoZSBkYXRhIEkgd2FudCBmcm9tIHRoZSBhcHByb3ByaWF0ZSBjb2x1bW5zLgpgYGB7cn0KYXJyYW4yMDA5MiA8LSBhcnJhbjIwMDkgJT4lCiAgc2VsZWN0KERhdGFab25lLCBnZW9tZXRyeSwgUGVyY2VudGlsZSkgJT4lCiAgbXV0YXRlKHllYXI9IjIwMDkiKQoKYXJyYW4yMDA2MiA8LSBhcnJhbjIwMDYgJT4lCiAgc2VsZWN0KERhdGFab25lLCBnZW9tZXRyeSwgUGVyY2VudGlsZSkgJT4lCiAgbXV0YXRlKHllYXI9IjIwMDYiKQoKYXJyYW4yMDA0MiA8LSBhcnJhbjIwMDQgJT4lCiAgc2VsZWN0KERhdGFab25lLCBnZW9tZXRyeSwgUGVyY2VudGlsZSkgJT4lCiAgbXV0YXRlKHllYXI9IjIwMDQiKQoKYXJyYW5zaW1kIDwtIHJiaW5kKGFycmFuMjAxNjIsYXJyYW4yMDEyMixhcnJhbjIwMDkyLGFycmFuMjAwNjIsYXJyYW4yMDA0MikKYGBgCgpUaGVuIEkgcGxvdCB0aGUgZGF0YSB6b25lcyB0byBsb29rIGF0IGFsbCBvZiB0aGVtLCBqdXN0IHRvIGRvdWJsZS1jaGVjayBub3RoaW5nIGVsc2UgY2hhbmdlZC4gKEl0IGxvb2tzIGxpa2UgdGhlIG9ubHkgY2hhbmdlIHdhcyBiZXR3ZWVuIDIwMTIgYW5kIDIwMTYpLgpgYGB7cn0KYXJyYW5zaW1kICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGFlcyhmaWxsID0gRGF0YVpvbmUpKSArCiAgZmFjZXRfd3JhcCgneWVhcicpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKQpgYGAKCiNBcnJhbiBQZXJjZW50aWxlIFBsb3RzCk5vdyBJIHBsb3QgdGhlIHBlcmNlbnRpbGVzLgpgYGB7cn0KYXJyYW5zaW1kICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGFlcyhmaWxsID0gUGVyY2VudGlsZSkpICsKICBmYWNldF93cmFwKCd5ZWFyJykgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkKYGBgCgpUaGVyZSB3ZSBhcmUuIE5vdCB0aGUgU0lNRCBoZWFsdGggcGVyY2VudGlsZXMgb2YgQXJyYW4gem9uZXMgdGhyb3VnaG91dCBTSU1EIGhpc3RvcnkuIEFuZCBJJ3ZlIGxlYXJuZWQgYSBsaXR0bGUgYml0IGFib3V0IGdyYXBoaWNzIGluIFIuCgpJZiBJIHdhbnRlZCB0byBJIGNvdWxkIHNob3cgdGhlIHpvbmVzIGluZGl2aWR1YWxseS4uCgpGaXJzdCBJIGZpbmQgdGhlIHVuaXF1ZSB6b25lcy4gKFRoZXJlIGFyZSAxNC4gNyBab25lcyAyMDE2LCA3IFpvbmVzIHByZS0yMDE2KQoKYGBge3J9CmRhdGF6b25lcyA8LSB1bmlxdWUoYXJyYW5zaW1kJERhdGFab25lKQpgYGAKCkknbGwgaGF2ZSB0byBmaW5kIG91dCBhIHNpbXBsZXIgd2F5IHRvIGRvIHRoaXMgYnV0Li4KCiNQcmUtMjAxNiBJbmRpdmlkdWFsIFpvbmVzCmBgYHtyfQpTMDEwMDQ0MDkgPC0gZmlsdGVyKGFycmFuc2ltZCwgRGF0YVpvbmU9PSJTMDEwMDQ0MDkiKQpTMDEwMDQzNzIgPC0gZmlsdGVyKGFycmFuc2ltZCwgRGF0YVpvbmU9PSJTMDEwMDQzNzIiKQpTMDEwMDQzNTMgPC0gZmlsdGVyKGFycmFuc2ltZCwgRGF0YVpvbmU9PSJTMDEwMDQzNTMiKQpTMDEwMDQzNTIgPC0gZmlsdGVyKGFycmFuc2ltZCwgRGF0YVpvbmU9PSJTMDEwMDQzNTIiKQpTMDEwMDQzNTEgPC0gZmlsdGVyKGFycmFuc2ltZCwgRGF0YVpvbmU9PSJTMDEwMDQzNTEiKQpTMDEwMDQzNTAgPC0gZmlsdGVyKGFycmFuc2ltZCwgRGF0YVpvbmU9PSJTMDEwMDQzNTAiKQpTMDEwMDQzNDkgPC0gZmlsdGVyKGFycmFuc2ltZCwgRGF0YVpvbmU9PSJTMDEwMDQzNDkiKQpgYGAKCmBgYHtyfQpmdW5jdGlvbjEgPC0gZnVuY3Rpb24oYXJndW1lbnQpIAp7CiAgYXJndW1lbnQgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fc2YoYWVzKGZpbGwgPSBQZXJjZW50aWxlKSkgKwogIGZhY2V0X3dyYXAoJ3llYXInKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkpCn0KYGBgCgpgYGB7cn0KZnVuY3Rpb24xKFMwMTAwNDQwOSkKZnVuY3Rpb24xKFMwMTAwNDM3MikKZnVuY3Rpb24xKFMwMTAwNDM1MykKZnVuY3Rpb24xKFMwMTAwNDM1MikKZnVuY3Rpb24xKFMwMTAwNDM1MSkKZnVuY3Rpb24xKFMwMTAwNDM1MCkKZnVuY3Rpb24xKFMwMTAwNDM0OSkKYGBgCgpUaGlzIGlzIGFsbCB3ZWxsIGFuZCBnb29kLiBCdXQgSSBmb3VuZCBpdCBkaWZmaWN1bHQgdG8gcmVtZW1iZXIgd2hpY2ggem9uZSB3ZW50IHdoZXJlLiBTbyBJJ3ZlIHBsb3R0ZWQgYSByZWZlcmVuY2UgaW1hZ2UgdG8gZ28gYmVzaWRlIHRoZSBjaGFydHMuCiNQcmUtMjAxNiBSZWZlcmVuY2UgSW1hZ2VzCmBgYHtyfQpmdW5jdGlvbjIgPC0gZnVuY3Rpb24oYXJndW1lbnQpIAp7CiAgYXJyYW5zdWJzZWN0ICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKCkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxKSkgKwogIGdlb21fc2YoZGF0YT0gYXJndW1lbnQsIGFlcyhmaWxsID0gRGF0YVpvbmUpKQp9CmBgYAoKYGBge3J9CmFycmFuc3Vic2VjdCA8LSBmaWx0ZXIocGNzLHN1YnN0cihsYWJlbCwxLDQpPT0iS0EyNyIpCgpmdW5jdGlvbjIoUzAxMDA0NDA5KQpmdW5jdGlvbjIoUzAxMDA0MzcyKQpmdW5jdGlvbjIoUzAxMDA0MzUzKQpmdW5jdGlvbjIoUzAxMDA0MzUyKQpmdW5jdGlvbjIoUzAxMDA0MzUxKQpmdW5jdGlvbjIoUzAxMDA0MzUwKQpmdW5jdGlvbjIoUzAxMDA0MzQ5KQpgYGAKCkJ1dCB0aGlua2luZyBhYm91dCBpdCwgSSBjb3VsZCBwbG90IGFsbCB0aGUgeWVhcnMgdG9nZXRoZXIgbGlrZSB0aGlzLgojUHJlLTIwMTYgSW5kaXZpZHVhbCBab25lcyBzaG93biBvbiB3aG9sZSBpc2xhbmQKYGBge3J9CmZ1bmN0aW9uMyA8LSBmdW5jdGlvbihhcmd1bWVudCkgCnsKICBhcmd1bWVudCAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gYXJyYW5zdWJzZWN0KSArCiAgZ2VvbV9zZihhZXMoZmlsbCA9IFBlcmNlbnRpbGUpKSArCiAgZmFjZXRfd3JhcCgneWVhcicpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSkKfQpgYGAKCmBgYHtyfQpmdW5jdGlvbjMoUzAxMDA0NDA5KQpmdW5jdGlvbjMoUzAxMDA0MzcyKQpmdW5jdGlvbjMoUzAxMDA0MzUzKQpmdW5jdGlvbjMoUzAxMDA0MzUyKQpmdW5jdGlvbjMoUzAxMDA0MzUxKQpmdW5jdGlvbjMoUzAxMDA0MzUwKQpmdW5jdGlvbjMoUzAxMDA0MzQ5KQpgYGAKCiMyMDE2Ck5vdyBJIGFwcGx5IHRoZSBzYW1lIGZ1bmN0aW9ucyB0byB0aGUgcG9zdC0yMDE2IFpvbmVzCmBgYHtyfQphcnJhbnN1YnNlY3QgPC0gZmlsdGVyKHBjcyxzdWJzdHIobGFiZWwsMSw0KT09IktBMjciKQoKUzAxMDExMTc3IDwtIGZpbHRlcihhcnJhbnNpbWQsIERhdGFab25lPT0iUzAxMDExMTc3IikKUzAxMDExMTcxIDwtIGZpbHRlcihhcnJhbnNpbWQsIERhdGFab25lPT0iUzAxMDExMTcxIikKUzAxMDExMTc0IDwtIGZpbHRlcihhcnJhbnNpbWQsIERhdGFab25lPT0iUzAxMDExMTc0IikKUzAxMDExMTc2IDwtIGZpbHRlcihhcnJhbnNpbWQsIERhdGFab25lPT0iUzAxMDExMTc2IikKUzAxMDExMTcyIDwtIGZpbHRlcihhcnJhbnNpbWQsIERhdGFab25lPT0iUzAxMDExMTcyIikKUzAxMDExMTczIDwtIGZpbHRlcihhcnJhbnNpbWQsIERhdGFab25lPT0iUzAxMDExMTczIikKUzAxMDExMTc1IDwtIGZpbHRlcihhcnJhbnNpbWQsIERhdGFab25lPT0iUzAxMDExMTc1IikKYGBgCgpgYGB7cn0KZnVuY3Rpb24xKFMwMTAxMTE3NykKZnVuY3Rpb24xKFMwMTAxMTE3MSkKZnVuY3Rpb24xKFMwMTAxMTE3NCkKZnVuY3Rpb24xKFMwMTAxMTE3NikKZnVuY3Rpb24xKFMwMTAxMTE3MikKZnVuY3Rpb24xKFMwMTAxMTE3MykKZnVuY3Rpb24xKFMwMTAxMTE3NSkKYGBgCmBgYHtyfQpmdW5jdGlvbjIoUzAxMDExMTc3KQpmdW5jdGlvbjIoUzAxMDExMTcxKQpmdW5jdGlvbjIoUzAxMDExMTc0KQpmdW5jdGlvbjIoUzAxMDExMTc2KQpmdW5jdGlvbjIoUzAxMDExMTcyKQpmdW5jdGlvbjIoUzAxMDExMTczKQpmdW5jdGlvbjIoUzAxMDExMTc1KQpgYGAKCmBgYHtyfQpmdW5jdGlvbjMoUzAxMDExMTc3KQpmdW5jdGlvbjMoUzAxMDExMTcxKQpmdW5jdGlvbjMoUzAxMDExMTc0KQpmdW5jdGlvbjMoUzAxMDExMTc2KQpmdW5jdGlvbjMoUzAxMDExMTcyKQpmdW5jdGlvbjMoUzAxMDExMTczKQpmdW5jdGlvbjMoUzAxMDExMTc1KQpgYGAKCiNQbG90IHRoZSBwZXJjZW50aWxlcyBhcyBiYXIgY2hhcnRzLgpgYGB7cn0KYXJyYW5zaW1kICU+JQpnZ3Bsb3QoYWVzKHg9eWVhciwgeT1QZXJjZW50aWxlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGZhY2V0X3dyYXAoJ0RhdGFab25lJykgKwogIGxhYnModGl0bGUgPSAiQXJyYW4gU0lNRCBEYXRhem9uZXMiLCB4ID0gIlllYXIiLCB5ID0gIlBlcmNlbnRpbGUiKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKI1NwbGl0dGluZyB0aGUgYmFyIGNoYXJ0cyB1cC4KSWRlYWxseSBub3cgSSdkIGxpa2UgdG8gYW5ub3RhdGUgdGhlIGFib3ZlIGRhdGEgdG8gaGlnaGxpZ2h0IHRoZSAyMDE2IHBsb3RzLCBhbmQgc2hvdyB3aGVyZSB0aGUgY2hhbmdlIGluIERaIG9jY3Vycy4gKEkuZSBkcmF3IGEgcG9seWdvbiBhcm91bmQgUzAxMDExMTcxLVMwMTAxMTE3NykuCkkgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhhdCB5ZXQsIHNvIHdoYXQgSSdsbCBkbyBub3cgaXMgc2VwZXJhdGUgaXQgaW50byAyIHBsb3RzLgoKUHJlLTIwMTYKYGBge3J9CmFycmFuc2ltZDIgPC0gZHBseXI6OmZpbHRlcihhcnJhbnNpbWQsIHllYXIgPCAyMDE2KQoKYXJyYW5zaW1kMiAlPiUKZ2dwbG90KGFlcyh4PXllYXIsIHk9UGVyY2VudGlsZSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICBmYWNldF93cmFwKCdEYXRhWm9uZScpICsKICBsYWJzKHRpdGxlID0gIkFycmFuIFNJTUQgRGF0YXpvbmVzIiwgeCA9ICJZZWFyIiwgeSA9ICJQZXJjZW50aWxlIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKClBvc3QtMjAxNgpgYGB7cn0KYXJyYW5zaW1kMyA8LSBkcGx5cjo6ZmlsdGVyKGFycmFuc2ltZCwgeWVhciA+PSAyMDE2KQoKYXJyYW5zaW1kMyAlPiUKZ2dwbG90KGFlcyh4PXllYXIsIHk9UGVyY2VudGlsZSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICBmYWNldF93cmFwKCdEYXRhWm9uZScpICsKICBsYWJzKHRpdGxlID0gIkFycmFuIFNJTUQgRGF0YXpvbmVzIiwgeCA9ICJZZWFyIiwgeSA9ICJQZXJjZW50aWxlIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGA=